MVVM 的流程是網路抓資料存進資料庫,再用觀察的方式查看資料有無變動,如果有就修改畫面,所以資料庫就很重要,這也是為什麼要學要學資料庫操作。
Room 是基於 SQLite 重新封裝過的套件,搭配常數式超好用。
Data class 是 Kotlin 出的新類別,用 Data class 建立的物件會自動建立 get、set、equal,當然也可以自己建立 get 和 set,總之就是很方便。
//基本
kapt 'androidx.room:room-compiler:2.4.0'
implementation "androidx.room:room-runtime:2.4.0"
implementation "androidx.room:room-ktx:2.4.0"
//測試
testImplementation "androidx.room:room-testing:2.4.0"
在資料庫當中,我們是用物件的形式來儲存資料,所以先建立 Data class 再設定成 Room 的實體
@Entity(tableName = "note_table")
data class Note(
@PrimaryKey(autoGenerate = true)
var classId: Long = 0L,
@ColumnInfo(number = "number")
var number: Int = 0,
@ColumnInfo(name = "name")
val name: String = "",
上面是放單純的整數或字串,如果要放物件怎麼辦呢?
首先我們先建好一個使用者資訊的 Data class
data class UserInfo(
@ColumnInfo(number = "number")
var number: Int = 0,
@ColumnInfo(name = "name")
val name: String = "",
)
在物件上使用@Embedded
,這樣就行囉
@Entity(tableName = "note_table")
data class Note(
@PrimaryKey(autoGenerate = true)
var classId: Long = 0L,
@Embedded(prefix = "userInfo_")
var userInfo: UserInfo?
)
又如果我們想要放陣列怎麼辦呢?
因為 SQLite 沒有 List 形別,所以要用@TypeConverters
轉換還有@Serializable
序列化
假如我們有個筆記清單陣列要存入 SQLite
實體長這樣
@Entity(tableName = "note_table")
@TypeConverters(StringTypeConverter::class)
data class Note(
val noteList: List<String>?
)
建立陣列和字串轉換的工具
class StringTypeConverter {
@TypeConverter
fun fromString(value: String): List<String> {
return value.split(",").map { it }
}
@TypeConverter
fun toString(list: List<String>): String {
return list.joinToString(separator = ",")
}
}
這樣 Room 在讀取和寫入的時後,就會用StringTypeConverter
幫我們自動轉換